
\subsection{Die Edubot-Klasse}

\subsubsection{Aufgaben}
Eines der Hauptziele bei der Entwicklung der API war es, die Verwendung so einfach wie möglich zu gestalten. Die Bedienung sollte selbsterklärend und effizient sein und dennoch genug Möglichkeiten zur Weiterentwicklung bilden.

\subsubsection{Aufbau}
Aufgrund der gegebenen Aufgabe, wurde die \textit{Edubot}-Klasse entwickelt, welche intern alle benötigten Informationen über die verwendeten Steuerungen und die dazugehörigen Roboter enthält. Durch die anfangs sehr unklare Situation in Bezug auf die Hardware, wurde diese Klasse möglichst flexibel gehalten und dient prinzipiell als Verwalter der verschiedenen Adapter (siehe Adapter-System), sowie als Verteiler für eingehende Befehle.

\subsubsection{Umsetzung}

Die \textit{Edubot}-Klasse ist relativ simpel aufgebaut und dient prinzipell mehr zu einer erleichterten Bedienung der API. Das Adapter-System ist hier durch ein Dictionary mit registrierten \textit{IAdapter}-Objekten verankert, durch welches bei Übergabe eine Befehls iteriert wird und der Befehl dabei an die individuellen Adapter übergeben wird. Es können beliebig viele Adapter bei der \textit{Edubot}-Klasse registriert werden, jedoch kann es, abhängig von der Rechnerleistung und der verwendeten Adapter, ab einer bestimmten Anzahl zu Performance-Einbußen kommen.\\
Um es dem Benutzer zu ermöglichen auf auftretende Ereignisse bei allen registrierten Adaptern zu reagieren, besitzt die \textit{Edubot}-Klasse dieselben Events wie die \textit{IAdapter}-Klasse. Damit der Benutzer nicht bei jedem der registrierten Adapter separat einen Event-Handler zuweisen muss, besitzt die \textit{Edubot}-Klasse ein Art "'globale"' Events. Will man Beispielsweise alle Zustandsveränderungen der registrierten Adapter verfolgen, so muss man nur auf das \textit{OnStateChanged}-Event der Edubot reagieren. Bei Eintreten des Events wird der auslösende Adapter im \textit{sender}-Parameter übergeben und die Details zum Ereignis im \textit{args}-Parameter festgehalten.\\
Für nähere Details zu den Events siehe "'Event-System"'. Um diese Aufgabe umzusetzen wird bei der Registrierung eines Adapters, auf jedem Events eine passende Methode aus der \textit{Edubot}-Klasse mitgegeben, die bei Eintreten des Events beim jeweiligen Adapter ausgeführt wird. Innerhalb der Methode wird das entsprechende "'globale"' Event der \textit{Edubot}-Klasse ausgelöst.\\
Die Klasse definiert folgende Properties und Variablen:
\begin{itemize}
\item \textbf{RegisteredAdapters}
\newline
Dieses Property repräsentiert ein Verzeichnis mit den registrierten Adaptern, welches durch ein Dictionary mit einem String als Schlüssel und einem \textit{IAdapter}-Objekt als Wert realisiert ist. Zum Verwalten des Verzeichnisses sollten die von der Klasse zur Verfügung gestellten Methoden \textit{RegisterAdapter} beziehungsweise \textit{DeregisterAdapter} verwendet werden. Das \textit{RegisteredAdapters}-Property ist nach außen hin sichtbar um lesenden Zugriff, wie beispielsweise das Abfragen der registrierten Adapter oder das Herausholen eines \textit{IAdapter}-Objekts, zu ermöglichen. 
\end{itemize}

Die \textit{Edubot}-Klasse besitzt nach außen nur drei Methoden, mit denen jedoch ein großer Teil der Gesamtkapazität der API genutzt werden kann. Diese Methoden werden im folgenden Abschnitt beschrieben:
\begin{itemize}
\item \textbf{RegisterAdapter}
\begin{lstlisting}[language = CSharp, captionpos=b, caption={Die RegisterAdapter-Methode}]
public bool RegisterAdapter(string name, IAdapter adapter)
        {
            if (registeredAdapters.ContainsKey(name) || registeredAdapters.ContainsValue(adapter))
                return false;

            adapter.OnHoming += RaiseHomingEvent;
            adapter.OnFailure += RaiseFailureEvent;
            adapter.OnAbort += RaiseAbortEvent;
            adapter.OnMovementStarted += RaiseMovementStartedEvent;
            adapter.OnShutDown += RaiseShutdownEvent;
            adapter.OnShuttingDown += RaiseShuttingDownEvent;
            adapter.OnToolUsed += RaiseToolUsedEvent;
            adapter.OnStateChanged += RaiseStateChangedEvent;
            registeredAdapters.Add(name, adapter);
            return true;
        }
\end{lstlisting}
Diese Methode übernimmt als ersten Parameter den String name und als weiteren das \textit{IAdapter}-Objekt \textit{adapter}. Bei Aufruf wir der mitgegebene Adapter unter dem angegebenen Namen im Dictionary \textit{registeredAdapter} eingetragen. Das direkte Hinzufügen eines Eintrags wird nicht empfohlen, da zusätzlich zum Hinzufügen auch geprüft wird ob der mitgegebene Schlüssel oder Adapter bereits im Verzeichnis registriert ist.\\
Das Hinzufügen von zwei oder mehreren Einträgen mit dem selben Schlüssel würde eine \textit{ArgumentException} auslösen, während das mehrfache Hinzufügen von ein und demselben \textit{IAdapter}-Objekt zu einer fehlerhaften Befehlsverteilung führen würde, da bei der Iteration durch das Verzeichnis der verteilte Befehl mehrfach an denselben Adapter weitergegeben werden würde. \\
Als Rückgabewert wird bei erfolgreichem Hinzufügen des Adapters \textit{true}, andernfalls \textit{false} zurückgeben.
\item \textbf{DeregisterAdapter}
\begin{lstlisting}[language = CSharp, captionpos=b, caption={Die DeregisterAdapter-Methode}]
public bool DeregisterAdapter(string name)
        {
            IAdapter adapter;
            if (registeredAdapters.TryGetValue(name, out adapter)) {
                adapter.OnHoming -= RaiseHomingEvent;
                adapter.OnFailure -= RaiseFailureEvent;
                adapter.OnAbort -= RaiseAbortEvent;
                adapter.OnMovementStarted -= RaiseMovementStartedEvent;
                adapter.OnShutDown -= RaiseShutdownEvent;
                adapter.OnShuttingDown -= RaiseShuttingDownEvent;
                adapter.OnToolUsed -= RaiseToolUsedEvent;
                adapter.OnStateChanged -= RaiseStateChangedEvent;
            }
            return registeredAdapters.Remove(name);
        }
\end{lstlisting}
Diese Methode übernimmt als Parameter einen String, welcher den Schlüssel des zu entfernenden Verzeichniseintrags enthält. Ist ein entsprechender Eintrag vorhanden so wird dieser entfernt und die Methode gibt \textit{true}, anderfalls \textit{false} zurück.
\item \textbf{Execute}
\begin{lstlisting}[language = CSharp, captionpos=b, caption={Die Execute-Methode der Edubot-Klasse}]
public void Execute(ICommand cmd) {
            foreach (KeyValuePair<string, IAdapter> entry in registeredAdapters)
            {
                IAdapter currentAdapter = entry.Value;
                currentAdapter.Execute(cmd);
            }
        }
\end{lstlisting}
Die Execute-Methode der Edubot-Klasse übernimmt als Parameter einen Befehl der von den registrierten Adaptern ausgeführt werden soll. Die eigentliche Arbeit dieser Methode besteht in der Weitergabe des Befehls an die registrierten Adapter, wodurch das Betreiben mehrerer Adapter vereinfacht wird. 
\end{itemize}

